/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.activity.adapter;

import java.util.ArrayList;
import java.util.List;

import ade.prime.activity.NotifySelectList;
import ade.prime.activity.R;
import ade.prime.model.Schedule;
import android.app.Activity;
import android.content.Context;
import android.os.RemoteException;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

/**
 * Défini la structure de la vue de la liste des emploi du temps à cocher afin d'être notifier.
 * Chaque ligne affiche une checkbox et le nom de l'emploi du temps.
 * @author Seb
 */
public class NotifyListAdapter extends BaseAdapter {

	protected static final String TAG = NotifyListAdapter.class.getSimpleName() ;

	protected List<Schedule> schedules ;

	protected LayoutInflater inflater ;

	protected Activity activity ;

	/**
	 * Initialise l'adaptateur de la liste d'emploi du temps.
	 * @param context 
	 */
	public NotifyListAdapter(Context context, Activity activity) {
		super() ;
		this.schedules = new ArrayList<Schedule>() ;
		this.inflater = LayoutInflater.from(context) ;
		this.activity = activity;
	}// NotifyListAdapter(Context context, Activity)

	/**
	 * Initialise l'adaptateur de la liste d'emploi du temps.
	 * @param context
	 * @param scheduleNames 
	 */
	public NotifyListAdapter(Context context, Activity activity, 
			List<Schedule> schedules) {
		this(context, activity) ;
		this.setSchedules(schedules) ;
	}// NotifyListAdapter(Context, Activity, List<Schedule>)


	/**
	 * Remplace la liste des emplois du temps par la liste fournie et prévient
	 * la liste (vue) du changement de contenu.
	 * 
	 * @param scheduleNames nouvelle liste des noms des d'emplois du temps
	 */
	public void setSchedules(List<Schedule> schedules) {
		this.schedules.clear() ;
		this.schedules.addAll(schedules) ;
		this.notifyDataSetChanged() ;
	}// setSchedules(List<Schedule>)

	/**
	 * Cette méthode permet de connaitre le nombre d'items présent dans la liste.
	 * @return nombre d'items présent dans la liste
	 */
	@Override
	public int getCount() {
		return this.schedules.size() ;
	}// getCount()

	/**
	 * Permet de retourner un objet contenu dans la liste à l'indice passé 
	 * en paramètre.
	 * 
	 * @param position index dans la liste d'emploi du temps
	 * @return objet contenu dans la liste à l'indice index
	 */
	@Override
	public Schedule getItem(int position) {
		return this.schedules.get(position) ;
	}// getItem(int)

	/**
	 * Retourne l'id d'un élément dans la liste à l'indice passé en paramètre.
	 * @param position index dans la liste d'emploi du temps
	 * @return id d'un élément dans la liste à l'indice index
	 */
	@Override
	public long getItemId(int position) {
		return position ;
	}// getItemId(int)

	/**
	 * Retourne la vue d'une ligne de la liste (checkbox, nom de l'emploi du temps).
	 * @param position index dans la liste d'emploi du temps
	 * @param contertView vue
	 * @param parent Vue parente
	 * @return vue d'une ligne de la liste
	 */
	@Override
	public View getView(int position, View contertView, ViewGroup parent) {
		final Schedule schedule = this.getItem(position) ;
		View v = this.inflater.inflate(R.layout.notify_listitem, null) ;
		
		TextView name = (TextView) v.findViewById(R.id.schedule_name) ;
		name.setText(schedule.getName()) ;
		
		CheckBox notify = (CheckBox) v.findViewById(R.id.schedule_notify) ;
		notify.setChecked(schedule.isNotify()) ;

		// Si la checkbox est cochée ou décochée alors on modifie l'edt en question
		notify.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				schedule.setNotify(isChecked) ;
				try {
					((NotifySelectList) NotifyListAdapter.this.activity)
					.updateScheduleNotify(schedule) ;
				} catch (RemoteException re) {
					Log.d(TAG, "Echec données edt maj notify", re) ; //$NON-NLS-1$
				}// try
			}// onCheckedChanged(CompoundButton, boolean)
		}) ;

		return v ;
	}// getView(int position, View contentView, ViewGroup)

}// class NotifyListAdapter